<?php
/** 
 * Servicio de base de datos.
 * @author gemu
 * 
 */
class Database
{
	private static $link;
	
	/**
	 * Conecta a la base de datos.
	 */
	private static function conectar() {
		$db = Zend_Registry::get("sistema-config")->db;
		$host = isset($db->host) ? $db->host : "localhost";
		$scheme = isset($db->scheme) ? $db->scheme : "sistema";
		$user = isset($db->user) ? $db->user : "";
		$pass = isset($db->pass) ? $db->pass : "";
    	
		Database::$link = mysql_connect($host, $user, $pass);
		if (!Database::$link) {
			Logger::log("Error al conectar al servidor de base de datos.");
			throw new FatalException(Constantes::ERROR_FATAL_CONEXION_BASEDATOS, null, mysql_errno());
		}
		if (!mysql_select_db($scheme, Database::$link)) {
			Logger::log("Error al seleccionar la base de datos.");
			throw new FatalException(Constantes::ERROR_FATAL_CONEXION_BASEDATOS, null, mysql_errno());
		}
	}
	
	/**
	 * Realiza una consulta a la base de datos.
	 * @param string $query
	 * @param Paginador $paginador
	 * @return resource
	 */
	public static function consulta($query, &$paginador=null) {
		if(!Database::$link) {
			Database::conectar();
		}
		
		$sqlPaginador = '';
		if($paginador != null) {
			Validator::validarNumero($paginador->regCardinal, 1, null, 'cardinal');
			
			// inicializa paginador
			if($paginador->direccion == null || $paginador->direccion == 0) {
				$result = mysql_query($query);
				if($result === false) {
					Logger::log(mysql_error());
					throw new FatalException(Constantes::ERROR_FATAL_OPERACION_BASEDATOS, null, mysql_errno());
				}
				$paginador->regIndice = 0;
				$paginador->regTotal = mysql_num_rows($result);
				$paginador->direccion = Constantes::DIRECCION_ACTUALIZAR;
			}
			
			// crea la cadena de paginacion
			if($paginador->direccion == Constantes::DIRECCION_AVANZAR) {
				$indice = intval($paginador->regIndice) + intval($paginador->regCardinal);
				$paginador->regIndice = ($indice > intval($paginador->regTotal)) ? intval($paginador->regIndice) : $indice;
			} else if($paginador->direccion == Constantes::DIRECCION_RETROCEDER) {
				$indice = intval($paginador->regIndice) - intval($paginador->regCardinal);
				$paginador->regIndice = ($indice < 0) ? intval($paginador->regIndice) : $indice;
			}
			$sqlPaginador = " LIMIT ".intval($paginador->regIndice).",".intval($paginador->regCardinal);
		}
		
		$result = mysql_query($query.$sqlPaginador);
		if($result === false) {
			Logger::log(mysql_error());
			throw new FatalException(Constantes::ERROR_FATAL_OPERACION_BASEDATOS, null, mysql_errno());
		}
		
		// actualiza datos del paginador
		if($paginador != null) {
			$paginador->pagActual = intval(ceil(($paginador->regIndice+1) / $paginador->regCardinal));
			$paginador->pagTotal = intval(ceil($paginador->regTotal / $paginador->regCardinal));
		}
		
		return $result;
	}
	
	/**
	 * Realiza una operacion en la base de datos.
	 * @param string $query
	 */
	public static function operacion($query) {
		if(!Database::$link) {
			Database::conectar();
		}
		if(!mysql_query($query)) {
			Logger::log(mysql_errno().': '.mysql_error());
			throw new FatalException(Constantes::ERROR_FATAL_OPERACION_BASEDATOS, null, mysql_errno());
		}
	}
	
	/**
	 * Retorna el numero de filas del objeto.
	 * @param multitype $objeto
	 * @return number
	 */
	public static function numeroFilas($objeto) {
		return mysql_num_rows($objeto);
	}
	
	/**
	 * Retorna el numero de filas afectadas por operaciones de Update.
	 * @return number
	 */
	public static function numeroFilasAfectadas() {
		return mysql_affected_rows();
	}
	
	/**
	 * Retorna una fila del objeto.
	 * @param multitype $objeto
	 * @return multitype:
	 */
	public static function obtenerFila($objeto) {
		return mysql_fetch_array($objeto);
	}
}
?>